#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

int main()
{
  printf("I am a process, pid: %d\n", getpid());
  //只要程序替换成功，就不会执行后续代码了，意味着exec*函数，不需要返回值检测
  //只要exec*函数返回了，就一定以调用失败了。！！
  execl("/usr/bin/lss", "ls", "-a", "-l", NULL);
  exit(1);
  printf("hello world!\n");
  printf("hello world!\n");
  printf("hello world!\n");
  printf("hello world!\n");
  return 0;
}

//int main()
//{
//  printf("I am a process, pid: %d\n", getpid());
////  execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
//  execl("/usr/bin/top", "top", NULL);
//
//  printf("hello world!\n");
//  printf("hello world!\n");
//  printf("hello world!\n");
//  printf("hello world!\n");
//  return 0;
//}

//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int cnt = 10;
//    while(cnt)
//    {
//      printf("child[%d] is running: cnt is: %d\n", getpid(), cnt);
//      --cnt;
//      sleep(1);
//    }
//    exit(0);
//  }  
//  //parent
//  printf("father wait begin!\n");
//  int status = 0;
// // pid_t ret = waitpid(id, &status, 0);//默认行为 阻塞等待
//  while(1)
//  {
//    pid_t ret = waitpid(id, &status, WNOHANG);//WNOHANG 非阻塞等待
//    if(ret == 0)
//    {
//      //子进程没有退出，但是waitpid成功了，需要父进程重复执行等待 
//      printf("Do father nothing!\n");
//    }
//    else if(ret > 0)
//    {
//      //子进程退出了，waitpid也成功了，获取到了对应的结果。
//      printf("father is wait: %d,success,status exit code: %d, status exit signal: %d\n", ret, (status>>8)&0xFF, status&0x7F);
//      break;
//    }
//    else 
//    {
//      //等待失败
//      perror("wait failed");
//      break;
//    }
//    sleep(1);
//  } 
//  return 0;
//}


//
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int cnt = 3;
//    while(cnt)
//    {
//      printf("child[%d] is running: cnt is: %d\n", getpid(), cnt);
//      --cnt;
//      sleep(1);
//    }
//    //int a = 0;
//    //a /= 0;
//   // exit(1);
//  }
//  //parent
//  sleep(10);
//  printf("father wait begin!\n");
//  int status = 0;
//  pid_t ret = waitpid(id, &status, 0);
//  if(ret > 0)
//  {
//    if(WIFEXITED(status))   //正常结束的，没有收到任何退出信号的。
//    {
//      //打印退出码
//      printf("status eixt code: %d\n",WEXITSTATUS(status));
//    }
//    else 
//    {
//
//      printf("error, get a signal!\n");
//    }
//  }
//  else 
//  {
//    printf("fathe wait failed!\n");
//  }
//  return 0;
//}


//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int cnt = 3;
//    while(cnt)
//    {
//      printf("child[%d] is running: cnt is: %d\n", getpid(), cnt);
//      --cnt;
//      sleep(1);
//    }
//    exit(1);
//  }
//  //parent
//  sleep(10);
//  printf("father wait begin!\n");
//  int status = 0;
//  pid_t ret = waitpid(id, &status, 0);//等待失败
//  if(ret > 0)
//  {
//    //status exit code  = (status>>8) & 1111 1111(0xFF)
//    //status exit signal = (status) & 01111 1111(0x7F)
//     printf("father is wait: %d, status exit code: %d, status exit signal: %d\n", ret, (status>>8)&0xFF, status&0x7F);
//  }
//  else 
//  {
//    printf("fathe wait failed!\n");
//  }
//  return 0;
//}


//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    //child
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("child[%d] is running: cnt is: %d\n", getpid(), cnt);
//      --cnt;
//      sleep(1);
//    }
//    exit(0);
//  }
//  //parent
//  sleep(10);
//  printf("father wait begin!\n");
//  // pid_t ret = wait(NULL);
//  //pid_t ret = waitpid(id, NULL, 0);//等待指定一个子进程
//  //pid_t ret = waitpid(-1, NULL, 0);//等待任意一个子进程
//  pid_t ret = waitpid(id + 1, NULL, 0);//等待失败
//  if(ret > 0)
//  {
//    printf("father is wait: %d, success\n", ret);
//  }
//  else 
//  {
//    printf("fathe wait failed!\n");
//  }
//
//  sleep(10);
//  return 0;
//}
//







//int main()
//{
//  printf("hello world!");//不带\n不会刷新缓冲区
//  sleep(4);
//  _exit(12);//强制终止进程，不会刷新缓冲区
//  //exit(EXIT_SUCCESS);//终止进程，会刷新缓冲区
//  return 0;
//}












//int fun()
//{
//  printf("fun test!\n");
//  return 1;
//}
//
//int main()
//{
//  fun();
//  exit(12);
//  for(int i = 0; i < 140; ++i)
//  {
//    printf("%d:%s\n", i, strerror(i));
//  }
//}

